/**
 *		包含通用公共方法的脚本
 *  
 *		AUTHOR:Ye	SINCE:20101004
 */

var oriClose = window.close;//原版的window.close方法

function closeWindow() {//在IE7中，无提示关闭窗口的方法
	top.oriOpener = top.opener;//保存原来的window.opener
	top.opener = null; 
	top.open('', '_self'); 
	window.oriClose();
}

window.close=closeWindow;//覆盖原版的window.close方法

/** 通过NAME或ID获得页面元素的通用方法 by Ye 101218 **/
function g(nameOrId,//要获得的DOM元素的name或ID
		windowObj){//获得的DOM元素所属的window对象（可选参数，不填则默认为window）
	
	if(!windowObj)
		windowObj = window;
	var rs = windowObj.document.getElementById(nameOrId);
	if (!rs)// 如果上面获取不到对象，则采用下面的方法取得对象实例
		rs = windowObj.document.getElementsByName(nameOrId)[0];
	if (!rs)// 如果上面获取不到对象，则采用下面的方法取得对象实例
		rs = windowObj.frames[nameOrId];
	
	return rs;
}

/** 打印调信息的方法 **/
function d(s){
	
	//如果有引入JSON的包，则把对象变为JSON再打印
	if(window.JSON){
		s = window.JSON.stringify(s);
	}
	
	//如果显示debug的窗口不存在，则初始化一个
	if(!window.debugWindow||window.debugWindow.closed){
		window.debugWindow = window.open();
		
		//如果本窗口关闭则debug窗口也关闭
		window.onbeforeunload=function(){
			window.debugWindow.close();
		};
	}
	
	window.debugWindow.document.write(s);
	window.debugWindow.document.write('<br/>');
}

/**
 * 为DOM元素targetElem的evenName事件追加事件触发时回调函数activeFun
 * 通过此函数为DOM元素绑定监听事件的好处在于：可以把新添加的监听函数与DOM元素
 * 已绑定的旧的监听函数合并成为新的监听函数，而不会覆盖DOM元素旧的同名监听函数。
 */
function addEventListener(targetElem,//需绑定监听事件的DOM元素
 							eventName,//事件名称，如：onclick
 							activeFun){//事件触发的回调函数
 	
 //DOM元素原来的监听事件
 var oriListener = targetElem[eventName];
 if(oriListener){//如果原来已经存在同名的监听事件了
 	targetElem[eventName] = function(){
 		oriListener.call(targetElem);//调用原来已经存在监听方法
 		activeFun.call(targetElem);//调用新添加的监听方法
 	}
 }else{
 	targetElem[eventName] = function(){
 		activeFun.call(targetElem);//调用新添加的监听方法
 	}
 }
}
 
/**
 * 初始化全选的checkBox
 */
function initSelectAllCheckBox(SelectAllCheckBoxNameOrId,//控制全选的复选框的name或id
								checkBoxName){//被全选或全不选的checkBox名字
	var selectAllCheckBox = g(SelectAllCheckBoxNameOrId);
	if(!selectAllCheckBox)
		return;
		
	var checkBoxs = document.getElementsByName(checkBoxName);
	if(!checkBoxs||checkBoxs.length<1)
		return;
		
	selectAllCheckBox.onclick = function(){
		
		for(var i=0;i<checkBoxs.length;i++){
			var c = checkBoxs[i];
			c.checked=this.checked;
		}
	}
}

/** 克隆对象obj并返回 **/
function clone(obj){
	var newObj = {};
	for(i in obj){
		newObj[i]=obj[i];
	}
	return newObj;
}

/** 把对象objCopyTo变得和objCopyFrom完全一样 **/
function copyObj(objCopyFrom,objCopyTo){
	
	//删除objCopyTo所有的原属性
	for(i in objCopyTo){
		delete(objCopyTo[i]);
	}
	
	//把objCopyFrom的属性进objCopyTo中
	for(i in objCopyFrom){
		objCopyTo[i]=objCopyFrom[i];
	}
	
	return objCopyTo;
}

/** 返回由对象obj中的所有属性组成的字符串 **/
function toString(obj){
	var rs = '';
	var first = true;
	for(i in obj){
		if(first)
			first = false;
		else
			rs+=',';
		rs+=i+':'+obj[i];
	}
	
	return rs;
}

/** 获得传入的url字符串的父级URL **/
function getParentUrl(url){
	
	var reg = "/(\/[^/]+)$/";
	var parentUrl = url.replace(reg,'/');
	return parentUrl;
}

/** 
 * 检查是否至少选中一个CheckBox false一个都未选中，true至少选中一个
 * 范必攀 by 2011-2-26
**/
function onCheckSelectedOneCheckBox(checkBoxName){
	var checkBoxs = document.getElementsByName(checkBoxName);
	if(!checkBoxs||checkBoxs.length<1)
	return false;
	
	for(var i=0;i<checkBoxs.length;i++){
		var c = checkBoxs[i];
		if(c.checked){
			return true;
		}
	}
	
	return false;
}

/** 
 * 获取选中的checkbox的值
 * 范必攀 by 2011-2-26
**/
function onGetValueFromSelectedCheckBox(checkBoxName){
	var selectedValue = "";
	
	var checkBoxs = document.getElementsByName(checkBoxName);
	if(!checkBoxs||checkBoxs.length<1)
	return null;
	
	for(var i=0;i<checkBoxs.length;i++){
		var c = checkBoxs[i];
		if(c.checked){
			if(selectedValue == "") selectedValue = c.value;
			else selectedValue += "," + c.value;
		}
	}
	
	return selectedValue;
}


/** 从父元素中移除本元素 **/
function removeElem(elem){
	elem.parentNode.removeChild(elem);//从父元素中移除本元素
}

/** 把对象或数组object深层拷贝并返回 */
function deepClone(object){
	
　　if(object==null) 
		return null;

	//如果是值类型则直接返回
　　if(("numberbooleanstringundefined").indexOf((typeof object).toLowerCase())>=0)
　　　　return object;

	//如果是数组
　　if(object instanceof Array){
　　　　var newArray=[];
　　　　for(var i=0;i<object.length;i++){
　　　　　　newArray.push(deepClone(object[i]));
　　　　}
　　　　return newArray;
　　}

	//如果是对象
　　var obj = new Object();
　　for(property in object){
　　　　obj[property] = deepClone(object[property]);
　　}

　　return obj;
}

/** 删除tableElem中的所有行 **/
function removeAllRows(tableElem){
	
	try{//对于非IE
		tableElem.innerHTML = '';
	}catch(e){//对于IE
		var trs = tableElem.childNodes;
		var length = tableElem.childNodes.length;
		for(var i=length-1;i>-1;i--){
			removeElem(trs[i]);
		}
	}
}

/** 
 * 计算居中窗口的Left
 * 范必攀 by 2011-2-28
**/
function calcWinLeft(w)
{
	var winWidth = window.screen.width;
	var left = ( winWidth - w ) / 2;
	return left;
}

/** 
 * 计算居中窗口的Top
 * 范必攀 by 2011-2-28
**/
function calcWinTop(h)
{
	var winHeight = window.screen.height;
	var top = ( winHeight - h - 100 ) / 2;
	return top;
}

/** 把数组中关于下拉菜单项的信息添加到下拉菜单中 **/
function addOptToSelect(selectObjOrNameOrId,//select 元素的name或id或对象
						optionInfoArray//保存下拉菜单项信息的数组
						){
							
	var selectElem;							
	if((typeof(selectObjOrNameOrId)).toLowerCase()=="string"){//如果为select元素的name或id
		selectElem = g(selectObjOrNameOrId);
	}else{
		selectElem = selectObjOrNameOrId;
	}
	
	for(var i=0; i<optionInfoArray.length;i++){
		var oneOptInfo = optionInfoArray[i];
		var value = oneOptInfo[0];
		var text = oneOptInfo[1];
		
		var opt = document.createElement("option");
		opt.value = value;
		opt.text = text;
		
		 //下面select元素的add方法，用于把一个option元素添加到select元素中。
	     try{
	     	selectElem.add(opt,null);//非IE浏览器的add方法，有两个参数
	     }
	     catch(e){
	     	selectElem.add(opt);//IE浏览器的add方法，只有一个参数
	     }
	}
}

/** 如果参数obj没属性，则返回true，否则返回false **/
function objHasNoAttr(obj){
	for(a in obj){
		return false;
	}
	return true;	
}

/** 如果为空obj，则返回true，否则返回false **/
function isNullObj(obj){
	if(!obj)
		return true;
	else
		return objHasNoAttr(obj);
}

/**
使用最小值为startNum，最大值为endNum的数字，初始化名字或ID为selectNameOrId的select元素
(初始化时text与value值相同)
*/
function initSelectByNum(selectNameOrId,startNum,endNum){
	var targetSelect = g(selectNameOrId);
	
	if(!targetSelect) return;
	
	var step = 1;
	if(startNum>endNum)
		step = -1;
		
	for(var i=startNum;;i+=step){
		var opt = document.createElement("option");
		opt.value = i;
		opt.text = i;
		
        //下面select元素的add方法，用于把一个option元素添加到select元素中。
         try{
         	targetSelect.add(opt,null);//非IE浏览器的add方法，有两个参数
         }
         catch(e){
         	targetSelect.add(opt);//IE浏览器的add方法，只有一个参数
         }
         
		if(i==endNum) break;
	}
}

/** 只保留指定的select元素的指定项目 **/
function removeSelectItemsWithout(selectNameOrId,//select元素的name或者ID
									notRemoveItemValueArr//保留的option项目的value组成的数组
									){
	
	var selectElem = g(selectNameOrId);//select元素
	var options = selectElem.options;
	var remainValue = {};//要保存的下拉菜单的值
	var removeOpts = {};//保留要删除的option元素
	var oriValue;//select元素原来的值
	
	//取得select元素原来的值
	for(var j=0;j<options.length;j++){
		if(options[j].selected){
			oriValue = options[j].value;
			break;
		}
	}
	
	//把不能移除的项目放到一个排重的集合remainValue中
	for(var i=0;i<notRemoveItemValueArr.length;i++){
		var v = notRemoveItemValueArr[i];
		remainValue[v] = true;
	}
	
	//把要删除的项目，放到排重的集合removeOpts中
	for(var j=0;j<options.length;j++){
		var optValue = options[j].value;
		if(!remainValue[optValue]){//如果不保留
			removeOpts[optValue] = options[j];//则放到待移除的集合中
		}
	}

	//删除不保存的元素
	for(key in removeOpts){
		selectElem.removeChild(removeOpts[key]);
	}
	
	//还原下拉菜单的默认值
	if(oriValue!==undefined){
		for(var j=0;j<selectElem.options.length;j++){
			var value = selectElem.options[j].value;
			if(value == oriValue){
				selectElem.options[j].selected = true;
				break;
			}
		}
	}
}

/** 返回selectNameOrId指定的select元素的value值 **/
function getSelectValue(selectNameOrId//要获得的select元素的name或ID
						){
	var s = g(selectNameOrId);
	return s.options[s.selectedIndex].value;
}

/** 把任何传入的select元素变为readonly不可编辑（在IE/FIREFOX/CHROME通过测试） **/
function setSelectReadOnly(selectNameOrId //要变为不可编辑的select元素的name或id
					){
	var s = g(selectNameOrId);	
	var opt = s.options[s.selectedIndex];//获得当前选中的option对象
	s.length = 0;
	
     try{
     	s.add(opt,null);//非IE浏览器的add方法，有两个参数
     }
     catch(e){
     	s.add(opt);//IE浏览器的add方法，只有一个参数
     }
     
     setReadOnly(selectNameOrId);
}

/** 把任何传入的DOM对象变为readonly不可编辑，在CHROME下无效 **/
function setReadOnly(elemNameOrId //要变为不可编辑的DOM元素的name或id
					){   
						
	 var obj = g(elemNameOrId);
     obj.onbeforeactivate = function(){return false;}
     obj.onfocus = function(){obj.blur();}
     
     /**
      * 如果只是fireFox，只要上面两项就够了。
      * 下面两项主要针对在IE中双击select元素时，依然可选而造的。
      */
     try{
	     obj.onmouseover = function(){if(obj.setCapture) obj.setCapture();}
	     obj.onmouseout = function(){if(obj.releaseCapture) obj.releaseCapture();}
     }catch(e){
     }
}   
		
/**参数:
iframeElement:iframe对象
url:iframeElement对象要加载网页的地址
*/
function changeIframeSrc(targetIframe,url){
	if(targetIframe){//如果此iframe存在
  	if(targetIframe.location){//对于IE内核的浏览器
  		targetIframe.location.href=url;//iframe跳转到参数url指定的页面
  		targetIframe.window.focus();//这一句一定要加，加了的话就会打印Iframe中的内容，不然就会打印当前窗口
	  		}
  		else if(targetIframe.src){//对于非IE内核的浏览器
  			targetIframe.src=url;//iframe跳转到参数url指定的页面
  			targetIframe.contentWindow.focus();//这一句一定要加，加了的话就会打印Iframe中的内容，不然就会打印当前窗口
  			}
  	}
}

/**
 * 检查给定的值value是否在数据库arr中存在，如果存在，则返回真，否则返回假
 */
function isValueInArr(value,
						arr){
	for(var i=0;i<arr.length;i++){
		if(arr[i]==value)
			return true;
	}
	return false;
}


	/**
	*@ numberType 要检验的数字类型,'1'为整数,'2'浮点
	*@ eidOrName 表单元素Id或Name
	*@ ename 表单元素lable
	*@ validateNull true为校验空值
	*@ min 最小值
	*@ max 最大值
	**/
	function validateNumber(numberType,eidOrName,ename,validateNull,min,max){
	
		var result = '';
		var tip = ename+'只能为数字!\n';
		if(null!=min && null!=max) tip = ename+'只能为数字,且范围在'+min+'到'+max+'之间!\n';
		
		var s = g(eidOrName).value;
		if(!validateNull){//不检验空值
			if(''==s){return result};
		}
		
		var regExp=/^\d+$/;		
		if('2'==numberType)	 regExp=/\d{1,3}(\.\d+)?$/;
		if(!regExp.test(s)){
			result = tip;
		}else if(null!=min && null!=max){
			var temp ;
			if('1'==numberType){
				temp= parseFloat(s);
			}else if('2'==numberType){
				temp= parseInt(s);
			}
			if(temp<min || temp>max){
				result = tip;
			}	
		}
		
		return result;
	}

	
//返回字符串s的字节数
function getStrByteCount(s){
	if(!s)
		return 0;
	
	//把所有两字节的字符全部变为“--”，然后再计算字条数
	return s.replace(/[^\x00-\xff]/gi,"--").length;
}


function checkStrMaxByte(value,//要校验的字符串
						msgHeader,//校验不通过时拼在返回消息的消息头
						maxLength,//最大字节数
						notNull){//true则不允许为空
	
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+":不能为空！\r\n";						
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
		
	var count = getStrByteCount(value);
	if(count>maxLength)//如果字节数超长
		return header+"长度超出限制！\r\n";
	else
		return '';
}
